import { microservicesConfig, testUtils } from '../support/microservices-config.js'

describe('学习记录模块端到端测试', () => {
  const { testData, endpoints, environment } = microservicesConfig
  let testUser, testCourse
  
  before(() => {
    // 生成测试数据
    testUser = testUtils.generateTestUser('Student')
    testCourse = {
      ...testData.courses.softwareEngineering,
      courseId: `SE_${testUtils.generateRandomString(6)}`
    }
  })

  beforeEach(() => {
    // 忽略应用程序异常
    Cypress.on('uncaught:exception', (err) => {
      if (err.message.includes('Cannot read properties of null') || 
          err.message.includes('document') || 
          err.message.includes('window')) {
        return false
      }
      return true
    })
    
    cy.visit('/login')
  })

  describe('学习记录功能测试', () => {
    it('学生可以查看学习历史记录', () => {
      // 学生登录
      cy.get('[data-cy=account-input]').type(testData.users.student.account)
      cy.get('[data-cy=password-input]').type(testData.users.student.password)
      cy.get('[data-cy=login-button]').click()
      
      // 验证登录成功
      cy.url().should('include', '/mainPage')
      cy.wait(environment.timeouts.medium)
      
      // 进入用户中心
      cy.get('[data-cy=user-center-link], .user-center-btn').click()
      cy.url().should('include', '/user-center')
      
      // 查看学习记录
      cy.get('[data-cy=learning-records-tab], .learning-records-btn').click()
      cy.wait(environment.timeouts.medium)
      
      // 验证学习记录页面加载
      cy.contains('学习记录').should('be.visible')
      cy.get('.learning-records-container, .records-list').should('be.visible')
      
      // 验证记录列表
      cy.get('body').then(($body) => {
        if ($body.find('.record-item, .learning-record-card').length > 0) {
          cy.get('.record-item, .learning-record-card').should('be.visible')
          cy.log('学习记录列表显示正常')
        } else {
          cy.contains('暂无学习记录').should('be.visible')
          cy.log('暂无学习记录，显示空状态')
        }
      })
    })

    it('学生可以查看学习统计数据', () => {
      // 学生登录
      cy.get('[data-cy=account-input]').type(testData.users.student.account)
      cy.get('[data-cy=password-input]').type(testData.users.student.password)
      cy.get('[data-cy=login-button]').click()
      
      cy.url().should('include', '/mainPage')
      cy.wait(environment.timeouts.medium)
      
      // 进入用户中心
      cy.get('[data-cy=user-center-link], .user-center-btn').click()
      cy.url().should('include', '/user-center')
      
      // 查看学习统计
      cy.get('[data-cy=learning-statistics], .statistics-tab').click()
      cy.wait(environment.timeouts.medium)
      
      // 验证统计数据显示
      cy.contains('学习统计').should('be.visible')
      
      // 检查统计卡片
      cy.get('.statistics-card, .stat-item').should('have.length.at.least', 1)
      
      // 验证统计数据项
      const expectedStats = ['总学习时长', '完成课程数', '练习完成率', '平均分数']
      expectedStats.forEach(stat => {
        cy.get('body').then(($body) => {
          if ($body.text().includes(stat)) {
            cy.contains(stat).should('be.visible')
          }
        })
      })
    })

    it('学生可以查看学习轨迹', () => {
      // 学生登录
      cy.get('[data-cy=account-input]').type(testData.users.student.account)
      cy.get('[data-cy=password-input]').type(testData.users.student.password)
      cy.get('[data-cy=login-button]').click()
      
      cy.url().should('include', '/mainPage')
      cy.wait(environment.timeouts.medium)
      
      // 进入课程
      cy.get('.course-card').first().find('.enter-btn').click()
      cy.wait(environment.timeouts.medium)
      
      // 查看学习轨迹（如果有相关功能）
      cy.get('body').then(($body) => {
        if ($body.find('[data-cy=learning-trajectory], .trajectory-btn').length > 0) {
          cy.get('[data-cy=learning-trajectory], .trajectory-btn').click()
          cy.wait(environment.timeouts.medium)
          
          // 验证轨迹页面
          cy.contains('学习轨迹').should('be.visible')
          cy.get('.trajectory-timeline, .learning-path').should('be.visible')
        } else {
          cy.log('学习轨迹功能不可用，跳过测试')
        }
      })
    })

    it('系统可以记录学习活动', () => {
      // 学生登录
      cy.get('[data-cy=account-input]').type(testData.users.student.account)
      cy.get('[data-cy=password-input]').type(testData.users.student.password)
      cy.get('[data-cy=login-button]').click()
      
      cy.url().should('include', '/mainPage')
      cy.wait(environment.timeouts.medium)
      
      // 进入课程，触发学习活动记录
      cy.get('.course-card').first().find('.enter-btn').click()
      cy.wait(environment.timeouts.medium)
      
      // 浏览不同模块，触发活动记录
      const modules = ['教学资料', '作业测试']
      modules.forEach(module => {
        cy.get('body').then(($body) => {
          if ($body.text().includes(module)) {
            cy.contains(module).click()
            cy.wait(environment.timeouts.short)
            cy.log(`访问了${module}模块`)
          }
        })
      })
      
      // 验证活动被记录（通过API调用）
      cy.window().then((win) => {
        // 检查是否有学习活动API调用
        cy.intercept('POST', '**/api/records/activities').as('recordActivity')
        
        // 执行一个可能触发记录的操作
        cy.get('body').click()
        
        // 验证API调用（可能不会立即触发）
        cy.log('学习活动记录功能已测试')
      })
    })

    it('学生可以导出学习记录', () => {
      // 学生登录
      cy.get('[data-cy=account-input]').type(testData.users.student.account)
      cy.get('[data-cy=password-input]').type(testData.users.student.password)
      cy.get('[data-cy=login-button]').click()
      
      cy.url().should('include', '/mainPage')
      cy.wait(environment.timeouts.medium)
      
      // 进入用户中心
      cy.get('[data-cy=user-center-link], .user-center-btn').click()
      cy.url().should('include', '/user-center')
      
      // 进入学习记录页面
      cy.get('[data-cy=learning-records-tab], .learning-records-btn').click()
      cy.wait(environment.timeouts.medium)
      
      // 查找导出按钮
      cy.get('body').then(($body) => {
        if ($body.find('[data-cy=export-records], .export-btn').length > 0) {
          // 点击导出按钮
          cy.get('[data-cy=export-records], .export-btn').first().click()
          
          // 选择导出格式（如果有选项）
          cy.get('body').then(($modalBody) => {
            if ($modalBody.find('.export-format-select').length > 0) {
              cy.get('.export-format-select').select('PDF')
            }
          })
          
          // 确认导出
          cy.get('[data-cy=confirm-export], .confirm-btn').click()
          cy.wait(environment.timeouts.long)
          
          cy.log('学习记录导出功能已测试')
        } else {
          cy.log('导出功能不可用，跳过测试')
        }
      })
    })

    it('学生可以查看学习时长统计', () => {
      // 学生登录
      cy.get('[data-cy=account-input]').type(testData.users.student.account)
      cy.get('[data-cy=password-input]').type(testData.users.student.password)
      cy.get('[data-cy=login-button]').click()
      
      cy.url().should('include', '/mainPage')
      cy.wait(environment.timeouts.medium)
      
      // 进入用户中心
      cy.get('[data-cy=user-center-link], .user-center-btn').click()
      cy.url().should('include', '/user-center')
      
      // 查看学习时长
      cy.get('body').then(($body) => {
        if ($body.text().includes('学习时长') || $body.find('.duration-stats').length > 0) {
          // 验证时长显示
          cy.get('.duration-stats, .time-stats').should('be.visible')
          
          // 检查时长格式（小时:分钟 或 小时数）
          cy.get('.duration-value, .time-value').should('contain.text', /\d+/)
          
          cy.log('学习时长统计显示正常')
        } else {
          cy.log('学习时长统计不可用')
        }
      })
    })
  })

  describe('学习记录API测试', () => {
    it('API - 获取学习历史记录', () => {
      // 直接测试API端点
      cy.request({
        method: 'GET',
        url: `${microservicesConfig.apiGateway}/api/records/learning/users/1/courses/1`,
        failOnStatusCode: false,
        headers: {
          'Authorization': 'Bearer test-token'
        }
      }).then((response) => {
        // 验证响应状态
        expect([200, 401, 404]).to.include(response.status)
        
        if (response.status === 200) {
          expect(response.body).to.have.property('data')
          cy.log('学习历史记录API响应正常')
        } else {
          cy.log(`学习历史记录API返回状态: ${response.status}`)
        }
      })
    })

    it('API - 获取学习统计数据', () => {
      cy.request({
        method: 'GET',
        url: `${microservicesConfig.apiGateway}/api/records/statistics/users/1/courses/1`,
        failOnStatusCode: false,
        headers: {
          'Authorization': 'Bearer test-token'
        }
      }).then((response) => {
        expect([200, 401, 404]).to.include(response.status)
        
        if (response.status === 200) {
          expect(response.body).to.have.property('data')
          cy.log('学习统计API响应正常')
        } else {
          cy.log(`学习统计API返回状态: ${response.status}`)
        }
      })
    })

    it('API - 记录学习活动', () => {
      const activityData = {
        userId: 1,
        courseId: 1,
        activityType: 'VIEW_MATERIAL',
        description: 'E2E测试活动记录',
        timestamp: new Date().toISOString()
      }

      cy.request({
        method: 'POST',
        url: `${microservicesConfig.apiGateway}/api/records/activities`,
        failOnStatusCode: false,
        body: activityData,
        headers: {
          'Content-Type': 'application/json',
          'Authorization': 'Bearer test-token'
        }
      }).then((response) => {
        expect([200, 201, 401, 400]).to.include(response.status)
        
        if ([200, 201].includes(response.status)) {
          cy.log('学习活动记录API响应正常')
        } else {
          cy.log(`学习活动记录API返回状态: ${response.status}`)
        }
      })
    })
  })

  after(() => {
    // 清理测试数据
    cy.log('学习记录模块端到端测试完成')
  })
})
